package com.li.hello.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 拦截器
 */
public class FirstInterceptor implements HandlerInterceptor {

    /**
     * 请求处理之前进行调用
     *
     * @param request
     * @param response
     * @param handler
     * @return
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException, ServletException {
        //只有返回true才会继续向下执行，返回false取消当前请求
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Methods", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
        System.err.println("------------------>:已完成跨域处理");

        boolean flag = true;
        String path = request.getServletContext().getRealPath("/");
        ;
        System.out.println(path);
        if (request.getSession() == null) {
            //假设用户未登录，跳转到指定页面
            request.getRequestDispatcher("WEB-INF/jsp/error.jsp").forward(request, response);
            flag = false;
        }
        //链接加xxx后重定向（demo.jsp不在WEB-INF中可以直接访问）
        String url = request.getRequestURI();
        if (url.indexOf("xxx") > -1) {
            response.sendRedirect("demo.jsp");
            flag = false;
        }

        return flag;
    }

    /**
     * Controller 方法调用之后执行，但是它会在DispatcherServlet 进行视图返回渲染之前被调用，
     * 所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。
     * postHandle 方法被调用的方向跟preHandle 是相反的，也就是说先声明的Interceptor 的postHandle 方法反而会后执行
     *
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("modelAndView");
    }

    /**
     * 该方法也是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行,
     * 这个方法的主要作用是用于进行资源清理工作的
     *
     * @param request
     * @param response
     * @param handler
     * @param ex
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("请求完成，资源清理");
    }
}
